/**
 * 封装 browser.tabs.query 方法，使其支持 Promise
 * @param queryInfo - 查询参数
 * @returns Promise<browser.tabs.Tab[]> - 返回匹配的标签页数组
 */
export const queryTabs = (queryInfo: Browser.tabs.QueryInfo): Promise<Browser.tabs.Tab[]> => {
  return new Promise((resolve) => {
    browser.tabs.query(queryInfo, resolve)
  })
}
/**
 * 获取当前窗口的活动标签页
 * @returns Promise<Browser.tabs.Tab> - 返回当前活动的标签页
 */
export const getActiveTab = async (): Promise<Browser.tabs.Tab> => {
  const tabs = await queryTabs({ currentWindow: true, active: true })
  return tabs[0]
}
/**
 * 清除包含指定URL的所有标签页
 * @param url - 要清除的URL
 * @returns Promise<boolean> - 清除完成后返回true
 */
export const removeTabs = async (url: string): Promise<boolean> => {
  const tabs = await queryTabs({ currentWindow: true })
  const targetTabs = tabs.filter((tab) => tab.url?.includes(url))
  // 如果
  if (tabs.length === targetTabs.length) {
    await createTab('chrome://newtab/')
  }
  if (targetTabs.length > 0) {
    const tabIds = targetTabs.map((tab) => tab.id!)
    await browser.tabs.remove(tabIds)
  }
  return true
}

/**
 * 打开新标签页并等待页面加载完成
 * @param url - 要打开的URL
 * @param active - 是否激活新标签页，默认为true
 * @returns Promise<Browser.tabs.Tab> - 返回新打开的标签页
 */
export const createTab = (url: string, active = true): Promise<Browser.tabs.Tab> => {
  return new Promise((resolve) => {
    browser.tabs.create({ url, active }, (tab) => {
      const tabId = tab.id!
      const listener = (updatedTabId: number, changeInfo: Browser.tabs.TabChangeInfo) => {
        if (updatedTabId === tabId && changeInfo.status === 'complete') {
          browser.tabs.onUpdated.removeListener(listener)
          resolve(tab)
        }
      }
      browser.tabs.onUpdated.addListener(listener)
    })
  })
}

/**
 * 发送消息到扩展程序
 * @param message - 要发送的消息
 * @returns Promise<any> - 返回接收方的响应
 */
export const sendMessage = (message: any) => {
  logger.info('标签页发送通信消息:', message?.type, message?.data)
  browser.runtime.sendMessage(message)
}
export const sendMessageAsync = <T = any>(message: any): Promise<T> => {
  logger.info('标签页发送异步通信消息:', message?.type, message?.data)
  return new Promise((resolve, reject) => {
    try {
      browser.runtime.sendMessage(message, (response) => {
        // 检查是否有运行时错误
        if (browser.runtime.lastError) {
          console.warn(`发送 ${message?.type} 消息时出错:`, browser.runtime.lastError.message)
          // 不要 reject，而是 resolve 一个空响应
          reject(browser.runtime.lastError)
        }
        console.info(`${message?.type} 消息发送成功:`, `message:`, message, `response: `, response)
        resolve(response)
      })
    } catch (error) {
      console.error('发送消息异常:', error)
      reject(error) // 同样返回空响应而不是拒绝
    }
  })
}
/**
 * 发送消息到标签页
 * @param type
 * @param data
 */
export const sendMessageTab = async (type: string, data: any, tabId?: number) => {
  logger.info('侧边栏发送通信给标签页:', type, data)
  if (!tabId) {
    const tab = await getActiveTab()
    tabId = tab?.id
  }
  browser.tabs.sendMessage(tabId!, { type, data })
}
/**
 * 发送消息到标签页
 * @param type
 * @param data
 */
export const sendMessageTabAsync = async <T = any>(
  type: string,
  data: any,
  tabId?: number,
): Promise<T> => {
  logger.info('侧边栏发送异步通信给标签页:', type, data)
  if (!tabId) {
    const tab = await getActiveTab()
    tabId = tab?.id
  }
  return new Promise((resolve, reject) => {
    try {
      browser.tabs.sendMessage(tabId!, { type, data }, (response) => {
        if (browser.runtime.lastError) {
          console.warn(`发送 ${type} 消息时出错:`, browser.runtime.lastError.message)
          reject(browser.runtime.lastError)
          return
        }
        resolve(response)
      })
    } catch (error) {
      console.error('发送标签页消息异常:', error)
      reject(error)
    }
  })
}
/**
 * 监听标签页加载完成
 * @returns Promise<Browser.tabs.Tab> - 标签页加载完成后resolve
 */
export const getActiveTabComplete = (): Promise<Browser.tabs.Tab> => {
  return new Promise(async (resolve) => {
    const tab = await getActiveTab()
    const listener = async (updatedTabId: number, changeInfo: Browser.tabs.TabChangeInfo) => {
      if (updatedTabId === tab.id && changeInfo.status === 'complete') {
        browser.tabs.onUpdated.removeListener(listener)
        resolve(await getActiveTab())
      }
    }
    browser.tabs.onUpdated.addListener(listener)
  })
}
/**
 * 刷新标签页并等待加载完成
 * @param tabId - 要刷新的标签页ID，不传则刷新当前活动标签页
 * @returns Promise<Browser.tabs.Tab> - 返回刷新后的标签页
 */
export const reloadTab = async (tabId?: number): Promise<Browser.tabs.Tab> => {
  return new Promise(async (resolve) => {
    // 如果没有传入tabId，获取当前活动标签页
    if (!tabId) {
      const activeTab = await getActiveTab()
      tabId = activeTab.id
    }
    // 刷新页面
    await browser.tabs.reload(tabId!)
    const tab = await getActiveTabComplete()
    resolve(tab)
  })
}
/**
 * 更新页面 用于控制
 * @param tabId
 * @returns
 */
export const updateTab = async (
  tabId?: number,
  options: Browser.tabs.UpdateProperties = { active: true },
): Promise<void> => {
  // 更新页面 用于控制
  await browser.tabs.update(tabId!, options)
}
/**
 * 打开扩展页面
 * @param pageName 页面名称，如 'chat.html' 或 'manage.html'
 * @param toastMessage 提示消息
 */
export const openExtensionPage = async (pageName: string) => {
  try {
    const url = browser.runtime.getURL(pageName as any)
    // await removeTabs(url)
    // const tabs = await browser.tabs.query({ url, currentWindow: true })
    // if (tabs.length > 0) {
    //   await browser.tabs.update(tabs[0].id!, { active: true })
    // } else {
    await browser.tabs.create({ url, active: true })
    // }
  } catch (error) {
    console.error('打开插件页面失败:', error)
  }
}
